package org.Yiran.timetale_re.client;

import net.minecraft.client.gui.screens.MenuScreens;
import net.minecraft.client.renderer.item.ItemProperties;
import net.minecraft.resources.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.EntityRenderersEvent;
import net.minecraftforge.client.event.RegisterGuiOverlaysEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import org.Yiran.timetale_re.Timetale_re;
import org.Yiran.timetale_re.client.gui.RuneBlueprintBookScreen;
import org.Yiran.timetale_re.client.gui.overlay.ModuleIconOverlay;
import org.Yiran.timetale_re.client.gui.overlay.RuneProficiencyOverlay;
import org.Yiran.timetale_re.entity.EntityRegister;
import org.Yiran.timetale_re.item.ItemsRegister;
import org.Yiran.timetale_re.item.rune.base.RuneItem;
import org.Yiran.timetale_re.menu.MenuRegister;
import org.Yiran.timetale_re.tile.TileEntityRegister;
import org.Yiran.timetale_re.tilerender.blockrender.LongTableBlockEntityRenderer;
import org.Yiran.timetale_re.tilerender.blockrender.SitEntityRenderer;
import org.Yiran.timetale_re.tilerender.mobrender.FlyingRuneRenderer;
import org.Yiran.timetale_re.tilerender.mobrender.ThrowableRuneRenderer;
import org.Yiran.timetale_re.util.cooldown.CooldownGuiOverlay;

/**
 * 客户端事件处理类
 * 负责处理所有客户端相关的初始化和注册事件
 * 包括GUI屏幕、渲染器、覆盖层等客户端专有内容的注册
 */
@Mod.EventBusSubscriber(modid = Timetale_re.MODID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD)
public class ClientModEvents {

    // ==================== 客户端设置事件 ====================

    /**
     * 客户端设置事件处理
     * 主要用于注册物品属性、GUI屏幕等客户端专有内容
     *
     * @param event FML客户端设置事件
     */
    @SubscribeEvent
    public static void onClientSetup(FMLClientSetupEvent event) {
        // 注册符文物品的模型变体
        event.enqueueWork(() -> {
            // 为符文物品注册自定义属性，用于模型变体选择
            ItemProperties.register(
                    ItemsRegister.RUNE.get(), // 目标物品：符文物品
                    ResourceLocation.fromNamespaceAndPath("timetale_re", "rune_type"), // 属性名称
                    (stack, level, entity, seed) -> {
                        // 根据符文类型返回对应的谓词值，用于选择正确的模型变体
                        String runeType = RuneItem.getRuneType(stack);
                        return RuneItem.getTypePredicateValue(runeType);
                    }
            );

            // 注册符文图纸手册屏幕
            MenuScreens.register(
                    MenuRegister.RUNE_BLUEPRINT_BOOK_MENU.get(), // 菜单类型
                    RuneBlueprintBookScreen::new // 屏幕构造器
            );
        });
    }

    // ==================== 方块实体渲染器注册事件 ====================

    /**
     * 注册方块实体渲染器事件处理
     * 用于注册自定义方块实体的渲染器
     *
     * @param event 实体渲染器注册事件
     */
    @SubscribeEvent
    public static void registerRenderers(EntityRenderersEvent.RegisterRenderers event) {
        // 注册长桌方块实体渲染器
        event.registerBlockEntityRenderer(
                TileEntityRegister.LONG_TABLE_BLOCK_ENTITY.get(), // 方块实体类型
                LongTableBlockEntityRenderer::new // 渲染器构造器
        );
    }

    // ==================== 实体渲染器注册事件 ====================

    /**
     * 注册实体渲染器事件处理
     * 用于注册自定义实体的渲染器
     *
     * @param event 实体渲染器注册事件
     */
    @SubscribeEvent
    public static void registerEntityRenderers(EntityRenderersEvent.RegisterRenderers event) {
        // 注册飞行符文实体渲染器
        event.registerEntityRenderer(
                EntityRegister.FLYING_RUNE.get(), // 实体类型
                FlyingRuneRenderer::new // 渲染器构造器
        );

        // 注册坐实体渲染器
        event.registerEntityRenderer(
                EntityRegister.SIT_ENTITY.get(), // 实体类型
                SitEntityRenderer::new // 渲染器构造器
        );

        // 注册投掷符文实体渲染器
        event.registerEntityRenderer(
                EntityRegister.THROWABLE_RUNE.get(), // 实体类型
                ThrowableRuneRenderer::new // 渲染器构造器
        );
    }

    // ==================== GUI覆盖层注册事件 ====================

    /**
     * 注册GUI覆盖层事件处理
     * 用于注册HUD界面元素
     *
     * @param event GUI覆盖层注册事件
     */
    @SubscribeEvent
    public static void registerOverlays(RegisterGuiOverlaysEvent event) {
        // 注册冷却覆盖层（显示物品冷却时间）
        event.registerAboveAll(
                "cooldown_overlay", // 覆盖层名称
                new CooldownGuiOverlay() // 覆盖层实例
        );

        // 注册符文熟练度覆盖层（显示符文制作熟练度）
        event.registerAboveAll(
                "rune_proficiency", // 覆盖层名称
                new RuneProficiencyOverlay() // 覆盖层实例
        );
        
        // 注册模块图标覆盖层（显示起子当前激活的功能模块图标）
        event.registerAboveAll(
                "module_icon", // 覆盖层名称
                new ModuleIconOverlay() // 覆盖层实例
        );
    }
}